package com.inifitness.common.tools;

import java.lang.reflect.Field;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

/**
 * 日期转换工具
 *
 * @author sunjinfeng
 * @version 1.0.0
 * @since 2024/04/18 11:00:00
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class DateUtils {

  /**
   * 区间日期格式化为数据库日期格式
   * <p>
   * eg：2021-01-01 → 2021-01-01 00:00:00
   *
   * @param obj                要处理的对象
   * @param startTimeFieldName 起始时间字段名
   * @param endTimeFieldName   结束时间字段名
   */
  public static void formatDBTimeInterval(Object obj, String startTimeFieldName,
      String endTimeFieldName) {
    Field startTimeField = ReflectUtil.getField(obj.getClass(), startTimeFieldName);
    Field endTimeField = ReflectUtil.getField(obj.getClass(), endTimeFieldName);

    if (startTimeField != null) {
      processDateTimeField(obj, startTimeField, startTimeFieldName, "yyyy-MM-dd 00:00:00");
    }

    if (endTimeField != null) {
      processDateTimeField(obj, endTimeField, endTimeFieldName, "yyyy-MM-dd 23:59:59");
    }
  }

  /**
   * 处理日期字段
   *
   * @param obj           要处理的对象
   * @param field         字段
   * @param fieldName     字段名
   * @param targetPattern 目标数据库日期格式
   */
  private static void processDateTimeField(Object obj, Field field, String fieldName,
      String targetPattern) {
    Object fieldValue = ReflectUtil.getFieldValue(obj, fieldName);
    if (fieldValue != null) {
      // 得到原始的日期格式
      String pattern = field.isAnnotationPresent(DateTimeFormat.class) ? field.getAnnotation(
          DateTimeFormat.class).pattern() : "yyyy-MM-dd";
      // 转换为日期对象
      DateTime dateTime = DateUtil.parse(StrUtil.toString(fieldValue), pattern);
      // 转换为目标数据库日期格式
      ReflectUtil.setFieldValue(obj, fieldName, dateTime.toString(targetPattern));
    }
  }
}
